package com.yugao.fintech.antelope.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yugao.fintech.antelope.system.model.entity.SysRole;
import com.yugao.fintech.antelope.system.model.entity.SysRoleMenu;
import com.yugao.fintech.antelope.system.model.rqrs.role.*;

import java.util.List;
import java.util.Set;

/**
 * 角色业务层
 */
public interface SysRoleService {
    /**
     * 根据条件分页查询角色数据
     *
     * @param query 角色信息
     * @return 角色数据集合信息
     */
    IPage<RoleResp> pageRole(RolePageReq query);

    List<RoleResp> listRole(RoleListReq query);

    /**
     * 根据用户ID查询角色
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    Set<String> listRolePermission(Long userId);

    /**
     * 根据用户ID查询角色
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    List<SysRole> listRoleByUserId(Long userId);

    /**
     * 查询所有角色
     *
     * @return 角色列表
     */
    List<RoleResp> listAllRole();

    /**
     * 根据用户ID获取角色选择框列表
     *
     * @param userId 用户ID
     * @return 选中角色ID列表
     */
    List<Long> listRoleIdsByUserId(Long userId);

    /**
     * 通过角色ID查询角色
     *
     * @param roleId 角色ID
     * @return 角色对象信息
     */
    SysRole getRoleById(Long roleId);

    /**
     * 校验角色是否允许操作
     *
     * @param role 角色信息
     */
    void checkRoleAllowed(SysRole role);

    /**
     * 通过角色ID查询角色使用数量
     *
     * @param roleId 角色ID
     * @return 结果
     */
    int countUserRoleByRoleId(Long roleId);

    /**
     * 新增保存角色信息
     *
     * @param req 角色信息
     */
    Long saveRole(RoleSaveReq req);

    /**
     * 修改保存角色信息
     *
     * @param req 角色信息
     * @return 结果
     */
    boolean updateRoleById(RoleUpdateReq req);

    /**
     * 修改角色状态
     *
     * @param role 角色信息
     * @return 结果
     */
    int updateRoleStatus(SysRole role);

    /**
     * 修改数据权限信息
     *
     * @param role 角色信息
     * @return 结果
     */
    int authDataScope(SysRole role);

    /**
     * 批量删除角色信息
     *
     * @param roleIds 需要删除的角色ID
     * @return 结果
     */
    boolean deleteRoleByIds(Long[] roleIds);

    /**
     * 获取角色权限
     *
     * @param permissionId 权限id
     * @param roleId       角色id
     */
    SysRoleMenu getRoleMenu(String permissionId, String roleId);

    /**
     * 保存角色权限数据
     */
    void saveRoleMenu(RolePermissionDataRuleSaveReq req);

    /**
     * 添加用户
     */
    void addUser(AssignRoleUserReq req);

    /**
     * 删除用户
     *
     * @param userId 用户id
     * @param roleId 角色id
     */
    void deleteUser(Long userId, Long roleId);

    /**
     * 批量删除用户
     *
     * @param userIds 用户ids
     * @param roleId  角色id
     */
    void deleteBatchUser(List<Long> userIds, Long roleId);

    List<SysRole> listRoleByIds(Set<Long> roleIds);
}
